/*java中cpu分给每个线程的时间片是随机的并且在java中好多都是多个线程共用一个资源，
 * 比如火车卖票，火车票是一定的，但卖火车票的窗口到处都有，每个窗口就相当于一个线程，
 * 这么多的线程共用所有的火车票这个资源。
 * 这么多的线程共用所有的火车票这个资源。
 * 如果在一个时间点上，两个线程同时使用这个资源，
 * 那他们取出的火车票是一样的（座位号一样），这样就会给乘客造成麻烦。
 *
 *
 ！！！将synchronized（同步锁）单独拿出来列为一个方法，那么每个实例在获得线程时另一个实例在等待该线程的释放，
               或者说：当一个线程要使用火车票这个资源时，我们就交给它一把锁，等它把事情做完后在把锁给另一个要用这个资源的线程。
                这 样就避免了所有错误的发生，如下：
                Rual号窗口卖出：10号票
				Emiya号窗口卖出：9号票
				Beckham号窗口卖出：8号票
				Beckham号窗口卖出：7号票
				Rual号窗口卖出：6号票
				Emiya号窗口卖出：5号票
				Beckham号窗口卖出：4号票
				Rual号窗口卖出：3号票
				Emiya号窗口卖出：2号票
				Rual号窗口卖出：1号票
			
 */
package thread.singleton.watson;

public class Thread004 implements Runnable{
    
	private static int ticket = 10;
	public Thread004() {
		// TODO Auto-generated constructor stub
	}
	
	@Override
	//尝试加上同步锁
	public void run() {
		// TODO Auto-generated method stub
		
		for (int i = 1; i <= 10; i++) {
			if (this.ticket > 0) {
				
					try {
						Thread.sleep(1000);
					} catch (Exception ex) {
						ex.printStackTrace();
					}
					this.sale();
					
				}
			

		}
		
	}

	public synchronized void sale(){
		if(this.ticket > 0){
		System.out.println(Thread.currentThread().getName()
				+ "号窗口卖出：" + this.ticket-- + "号票");
		}
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
 		
		Thread004 demo=new Thread004();
			 //基于火车票创建三个窗口，三个窗口随时随机获得cpu线程
		     //线程一调用run()方法
			 new Thread(demo,"Rual").start();
			 //线程二调用run()方法
			 new Thread(demo,"Beckham").start();
			 //线程三调用run()方法
			 new Thread(demo,"Emiya").start();
		 
		
	}

	

}
